package ar.com.tallerdos.smartdinner.model;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import ar.com.tallerdos.smartdinner.model.Pedido.PedidoEstado;
import ar.com.tallerdos.smartdinner.util.Descriptible;
import ar.com.tallerdos.smartdinner.util.StringUtils;

import com.google.gson.annotations.Expose;

public class Comida implements Identity {

    public enum ComidaEstado {
	ABIERTA, CERRADA
    }

    @Expose
    private Integer id;

    @Expose
    private List<Mesa> mesas;

    @Expose
    private ComidaEstado estado;

    @Expose
    private Integer cantidadComensales;

    @Expose
    private Date horaInicio;

    @Expose
    private Date horaFin;

    @Expose
    private List<Pedido> pedidos;

    @Expose
    private Integer codigo;
    
    @Expose
    private Boolean cerrado;

    private Boolean facturado;
    private Boolean facturaEntregada;
    
    private int notificacion;
    
    private Descuento descuento;

    public Comida() {
	this.horaInicio = new Date();
	this.estado = ComidaEstado.ABIERTA;
	this.pedidos = new ArrayList<Pedido>();
	this.cantidadComensales = 4;
	this.cerrado = false;
	this.facturado = false;
	this.facturaEntregada = false;
    }

    public Integer getId() {
	return id;
    }

    public void setId(Integer id) {
	this.id = id;
    }

    public ComidaEstado getEstado() {
	return estado;
    }

    public void setEstado(ComidaEstado estado) {
	this.estado = estado;
    }

    public Integer getCantidadComensales() {
	return cantidadComensales;
    }

    public void setCantidadComensales(Integer cantidadComensales) {
	this.cantidadComensales = cantidadComensales;
    }

    public List<Pedido> getPedidos() {
	return pedidos;
    }

    public void setPedidos(List<Pedido> pedidos) {
	this.pedidos = pedidos;
    }

    public Date getHoraInicio() {
	return horaInicio;
    }

    public void setHoraInicio(Date horaInicio) {
	this.horaInicio = horaInicio;
    }

    public Date getHoraFin() {
	return horaFin;
    }

    public void setHoraFin(Date horaFin) {
	this.horaFin = horaFin;
    }

    @Override
    public String toString() {
	return StringUtils.generarDescripcion(this.getMesas(), "Mesa ", "Mesas ", "",
		"ComidaDao sin mesa asignada", 
		new Descriptible() {
		    @Override
		    public String getDescripcion(Object o) {
			Mesa mesa = (Mesa)o;
			return (mesa != null ? mesa.getCodigo().toString() : "");
		    }
		});
    }

    public Double getTotal() {
	Double total = Double.valueOf(0);
	if (pedidos != null) {
	    for (Pedido pedido : pedidos) {
		if (pedido != null 
			&& pedido.getProducto() != null
			&& pedido.getProducto().getPrecio() != null
			&& pedido.getCantidad() != null
			&& !PedidoEstado.Cancelado.equals(pedido.getEstado())) {
		    total += pedido.getProducto().getPrecio() * pedido.getCantidad();
		    
		}
	    }
	}
	Double importeDescuento = Double.valueOf(0);
	if (this.descuento != null) {
	    importeDescuento = total * this.descuento.getPorcentaje() / 100;
	}
	return total - importeDescuento;
    }

    public String getTotalDosDecimales() {
	if (getTotal() == null) {
	    return "N/A";
	} else {
	    NumberFormat formatter = new DecimalFormat("#0.00");
	    return formatter.format(getTotal());
	}
    }

    /**
     * Id del pedido en la base del backend
     * @return
     */
    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    public List<Mesa> getMesas() {
        return mesas;
    }

    public void setMesas(List<Mesa> mesas) {
        this.mesas = mesas;
    }

    public int getNotificacion(){
    	return this.notificacion;
    }
    
    public void setNotificacion(int notif){
    	this.notificacion = notif;
    }

    public Boolean getCerrado() {
        return cerrado;
    }

    public void setCerrado(Boolean cerrado) {
        this.cerrado = cerrado;
    }

    public Boolean getFacturado() {
        return facturado;
    }

    public void setFacturado(Boolean facturado) {
        this.facturado = facturado;
    }

    public Boolean getFacturaEntregada() {
        return facturaEntregada;
    }

    public void setFacturaEntregada(Boolean facturaEntregada) {
        this.facturaEntregada = facturaEntregada;
    }

    public Descuento getDescuento() {
        return descuento;
    }

    public void setDescuento(Descuento descuento) {
        this.descuento = descuento;
    }
    
    
}
